package com.springMVCStudy.param;

import com.springMVCStudy.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.List;

/*
param参数接收的四种场景
 */
@Controller
@RequestMapping("param")
public class ParamController {

    // 直接接收
    /*
    形参列表，填写对应名称的参数即可（如/param/data?name=root&age=18)
    前端传值不要求写全（比如只写/param/data?age=1），但不能不传值（/param/data）
     */
    @RequestMapping("data")
    @ResponseBody
    public String data(String name, int age) {
        System.out.println("name = " + name + ", age = " + age);
        return "name = " + name + ", age = " + age;
    }


    // 注解指定
    /*
    指定任意的请求参数名，可以要求必须传递，也可以要求不必须传递，给予一个默认值
    写一个业务：参数userName必须传递，参数page可以不必须传递，如果不传递默认值是1
    @RequestParam注解加在形参上，value属性指定请求参数名，required指定是否必须传递，默认true即必须
     */
    @RequestMapping("data1")
    @ResponseBody
    public String data1(@RequestParam(value = "name") String userName, @RequestParam(required = false, defaultValue = "1") int page) {
        System.out.println("userName = " + userName + ", page = " + page);
        return "userName = " + userName + ", page = " + page;
    }


    // 特殊值
    /*
    一名多值，如/param/data2?hobbies=hhh&&hobbies=kk
    这种情况必须要加上@RequestParam注解，加上后handlerAdaptor才会将对应字符串加入集合中，否则会类型异常
     */
    @RequestMapping("data2")
    @ResponseBody
    public String data2(@RequestParam List<String> hobbies) {
        System.out.println("hobbies = " + hobbies);
        return "hobbies = " + hobbies;
    }

    // 使用实体类对象接值
    /*
    如用户注册（用户的信息） -> 对应的实体类 -> 插入到数据库中
    /param/data3?username=humgry&password=123456，准备一个有对应属性、getter和setter的实体类即可
    前端请求参数名需要和实体类的属性名相同
     */
    @RequestMapping("data3")
    @ResponseBody
    public String data3(User user) {
        System.out.println("user = " + user);
        return "user = " + user;
    }

}
